#ifndef _WX_PICKERBASE_H_BASE_
#define _WX_PICKERBASE_H_BASE_

#include "wx/control.h"
#include "wx/sizer.h"
#include "wx/containr.h"

class wxTextCtrl;
class wxToolTip;

extern const wxChar wxButtonNameStr[];

#define wxPB_USE_TEXTCTRL           0x0002

class wxPickerBase : public wxControl {
  public:
    // ctor: text is the associated text control
    wxPickerBase() : m_text( NULL ), m_picker( NULL ), m_sizer( NULL ) { m_container.SetContainerWindow( this ); }
    virtual ~wxPickerBase() {}


    // if present, intercepts wxPB_USE_TEXTCTRL style and creates the text control
    // The 3rd argument is the initial wxString to display in the text control
    bool CreateBase( wxWindow *parent,
                     wxWindowID id,
                     const wxString& text = wxEmptyString,
                     const wxPoint& pos = wxDefaultPosition,
                     const wxSize& size = wxDefaultSize,
                     long style = 0,
                     const wxValidator& validator = wxDefaultValidator,
                     const wxString& name = wxButtonNameStr );

  public:     // public API

    // margin between the text control and the picker
    void SetInternalMargin( int newmargin ) { GetTextCtrlItem()->SetBorder( newmargin ); m_sizer->Layout(); }
    int GetInternalMargin() const
    { return GetTextCtrlItem()->GetBorder(); }

    // proportion of the text control
    void SetTextCtrlProportion( int prop ) { GetTextCtrlItem()->SetProportion( prop ); m_sizer->Layout(); }
    int GetTextCtrlProportion() const
    { return GetTextCtrlItem()->GetProportion(); }

    // proportion of the picker control
    void SetPickerCtrlProportion( int prop ) { GetPickerCtrlItem()->SetProportion( prop ); m_sizer->Layout(); }
    int GetPickerCtrlProportion() const
    { return GetPickerCtrlItem()->GetProportion(); }

    bool IsTextCtrlGrowable() const
    { return ( GetTextCtrlItem()->GetFlag() & wxGROW ) != 0; }
    void SetTextCtrlGrowable( bool grow = true ) {
      int f = GetDefaultTextCtrlFlag();
      if( grow ) {
        f |= wxGROW;
      } else
      { f &= ~wxGROW; }
      GetTextCtrlItem()->SetFlag( f );
    }

    bool IsPickerCtrlGrowable() const
    { return ( GetPickerCtrlItem()->GetFlag() & wxGROW ) != 0; }
    void SetPickerCtrlGrowable( bool grow = true ) {
      int f = GetDefaultPickerCtrlFlag();
      if( grow ) {
        f |= wxGROW;
      } else
      { f &= ~wxGROW; }
      GetPickerCtrlItem()->SetFlag( f );
    }

    bool HasTextCtrl() const { return m_text != NULL; }
    wxTextCtrl *GetTextCtrl() { return m_text; }
    wxControl *GetPickerCtrl() { return m_picker; }
    virtual void UpdatePickerFromTextCtrl() = 0;
    virtual void UpdateTextCtrlFromPicker() = 0;

  protected:
    // overridden base class methods
    #if wxUSE_TOOLTIPS
    virtual void DoSetToolTip( wxToolTip *tip );
    #endif // wxUSE_TOOLTIPS
    void OnTextCtrlDelete( wxWindowDestroyEvent & );
    void OnTextCtrlUpdate( wxCommandEvent & );
    void OnTextCtrlKillFocus( wxFocusEvent & );
    void OnSize( wxSizeEvent & );
    virtual long GetTextCtrlStyle( long style ) const { return ( style & wxWINDOW_STYLE_MASK ); }
    virtual long GetPickerStyle( long style ) const { return ( style & wxWINDOW_STYLE_MASK ); }
    wxSizerItem *GetPickerCtrlItem() const {
      if( this->HasTextCtrl() ) {
        return m_sizer->GetItem( ( size_t )1 );
      }
      return m_sizer->GetItem( ( size_t )0 );
    }
    wxSizerItem *GetTextCtrlItem() const {
      wxASSERT( this->HasTextCtrl() );
      return m_sizer->GetItem( ( size_t )0 );
    }

    int GetDefaultPickerCtrlFlag() const {
      return wxALIGN_CENTER_VERTICAL | wxGROW ;
    }

    int GetDefaultTextCtrlFlag() const {
      return wxALIGN_CENTER_VERTICAL | wxRIGHT ;
    }

    void PostCreation();

  protected:
    wxTextCtrl *m_text;
    wxControl *m_picker;
    wxBoxSizer *m_sizer;

  private:
    DECLARE_ABSTRACT_CLASS( wxPickerBase )
    DECLARE_EVENT_TABLE()
    WX_DECLARE_CONTROL_CONTAINER();
};

#endif
